有些課名實在是太長了,總會有許多神奇的簡稱出現,特教導=特殊教育導論、普生=普通生物學、脊比=脊椎動物比較解剖,而這些用詞若輸入在機器人反而都無法回覆,由於人類對於發想簡稱是沒有相對固定的形式,實務上多仰賴在學生彼此之間的口耳相傳,於是今天就做一個課名與簡稱的資料表,讓使用者能以簡稱方式輸入課名。
一堂課可能有不一樣的簡稱,所以需要一個新資料表,本來想要設計關聯式的資料表,但是問了問 ChatGPT 似乎沒有比較好的設計方法,如果先進前輩有好的建議請不吝留言指教~
新增一課名簡稱資料表: 欄位包含全名、簡稱
class CourseAlias(models.Model):
course_name = models.CharField(max_length=20, verbose_name="課名全稱")
alias = models.CharField(max_length=20, verbose_name="課程簡稱")
def __str__(self):
return self.alias
admin.py
新增相關資料:
from .models import Course, CourseAlias
@admin.register(CourseAlias)
class CourseAliasAdmin(ImportExportModelAdmin):
list_display = ('course_name', 'alias')
遷移資料表:
$ py manage.py makemigrations
$ py manage.py migrate
使用者輸入課名時,先篩選全名再找找簡稱: 一點都不複雜,就是在原本 handle_msg
函式的二分法判斷中,最後再加入簡稱的搜尋,所以就再加上個 elif
~
在函式的前幾行先進行資料表的搜尋:
# hulolo > chatbot > views.py
filtered_teacher = Course.objects.filter(teacher_name=user_message)
filtered_course = Course.objects.filter(course_name=user_message)
# 新增了對課名簡稱資料表的搜尋
filtered_course_alias = CourseAlias.objects.filter(alias=user_message)
# hulolo > chatbot > views.py
# 如果課名簡稱資料表有值
elif filtered_course_alias.exists():
# 取得對應的課名簡稱全稱
full_course_name = filtered_course_alias.course_name
# 再將全稱去搜尋 Course 資料表的內容
filtered_course = Course.objects.filter(course_name=full_course_name).values_list(
'teacher_name', flat=True).distinct()
# 後面則與先前查詢課名邏輯相同
flex_message = dynamic_flex_message_package(
course_name, candidate_teachers, label_type='teacher')
message = FlexSendMessage(
alt_text=f"{course_name} 的老師",
contents=flex_message
)
line_bot_api.reply_message(
event.reply_token,
message)
else:
print("Empty")
無論輸入 特殊教育學生評量 或 特教評 都能夠跑出對應的列表:
在這篇文章中,我們學會了: